import {
  Controller,
  Get,
  Post,
  Body,
  Param,
  BadRequestException,
  UseInterceptors,
  ClassSerializerInterceptor,
} from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { UpdatePasswordDto } from './dto/update-password.dto';
import { User } from './entities/user.entity';

@ApiTags('用户')
@Controller('users')
export class UsersController {
  constructor(private readonly userService: UsersService) {}

  @ApiOperation({ summary: '创建用户' })
  @Post('create')
  create(@Body() createUserDto: CreateUserDto) {
    return this.userService.create(createUserDto);
  }

  @ApiOperation({ summary: '查询所有用户' })
  @UseInterceptors(ClassSerializerInterceptor)
  @Get('queryAll')
  async findAllV1() {
    // 请注意，我们必须返回该类的一个实例。
    // 如果你返回一个纯 JavaScript 对象，
    // 例如 { user: new UserEntity() }，
    // 则该对象将不会被正确序列化。
    return (await this.userService.findAll()).map((user) => new User(user));
  }

  @ApiOperation({ summary: '查询用户' })
  @Get('query/:id')
  findOne(@Param('id') id: string) {
    return this.userService.findOne(id);
  }

  @ApiOperation({ summary: '编辑用户' })
  @Post('update')
  update(@Body() updateUserDto: UpdateUserDto) {
    return this.userService.update(updateUserDto);
  }

  @ApiOperation({ summary: '删除用户' })
  @Post('delete/:id')
  remove(@Param('id') id: string) {
    return this.userService.remove(id);
  }

  @ApiOperation({ summary: '修改密码' })
  @Post('updatePassword')
  updatePassword(@Body() updatePasswordDto: UpdatePasswordDto) {
    // TODO: implement password update logic
    // admin md5
    // 21232f297a57a5a743894a0e4a801fc3
    if (
      !updatePasswordDto ||
      !updatePasswordDto.userId ||
      !updatePasswordDto.password
    ) {
      throw new BadRequestException('Invalid parameters');
    }
    return this.userService.updatePassword(
      updatePasswordDto.userId,
      updatePasswordDto.password,
    );
  }
}
